L’analyse factorielle multiple (AFM) est une technique de traitement et de visualisation des données multidimensionnelles qui a pour objectif de réduire la dimensionnalité d’un ensemble de données tout en conservant le maximum d’informations. Elle est similaire à l’analyse en composantes principales (ACP), mais elle est plus flexible et permet de prendre en compte des hypothèses sur les relations entre les variables.

Comme pour l’ACP, l’AFM consiste à trouver de nouvelles variables, appelées “facteurs”, qui sont des combinaisons linéaires des variables originales. Ces facteurs sont choisis de sorte qu’ils expliquent le maximum de variance possible dans les données. Toutefois, contrairement à l’ACP, l’AFM permet de spécifier des hypothèses sur les relations entre les variables, par exemple en imposant que certains facteurs soient corrélés entre eux.

L’AFM est souvent utilisée lorsque l’on veut comprendre les relations de causalité entre les variables et lorsqu’on veut créer des indices composites à partir de plusieurs variables. Elle est également utilisée en prétraitement de données avant de les utiliser dans un modèle de prédiction ou de classification.

library(tidyverse)  # Manipulation des données
library(readxl)     # Lecture des fichiers Excel
library(ggpubr)     # Représentations graphiques
library(rstatix)    # Tests statistiques en langage Dplyr
library(FactoMineR) # Analyses en composantes principales
library(factoextra) # Visualisation graphique de l'ACP
library(gtsummary)  # Résumé descriptif des données
library(corrplot)   # Corrélogrammes
library(plotly)     # Graphes intéractifs

Avec les données complètes

data <- read_excel("data/data_ubs.xlsx", sheet = "data_afm")
data$ID <- as.factor(data$ID)
data$Pays <- as.factor(data$Pays)
data$Poste <- as.factor(data$Poste)
data$Region <- as.factor(data$Region)
data$Experience <- as.factor(data$Experience)
data$Age <- as.factor(data$Age)
data$Sexe <- as.factor(data$Sexe)
data$Experience <- as.factor(data$Experience)
data$Type <- as.factor(data$Type)

data <- data %>%
  select(-C2, -C3, -C4.1,   -C4.2, -C4.3, -C4.4, -C4.5, -C4.6, -C4.7, -C4.8, -C4.9, -Type, -Pays, -Sexe)

data <- column_to_rownames(data, "ID")

dataComp <- data %>%
  drop_na()

dataComp

Corrélations

dataComp %>%
  select(where(is.numeric)) %>%
  cor_mat() %>%
  cor_plot(method = "square", type = "lower", insignificant = "blank")

Le manque de corrélations entre les variables peut déjà nous indiquer que l’ensemble des données ne pourra pas expliquer une grande partie de la variance. De plus, les dimensions de l’analyses ne pourront pas représenter les variables dans leur entièreté.

dataComp %>%
  select(where(is.numeric)) %>%
  cor_mat() %>%
  cor_plot(method = "square", type = "lower", insignificant = "blank")

MFA

res.mfa <- MFA(dataComp, 
               group = c(1, 1, 1, 1, 4, 6, 8, 4, 1, 6, 9, 5),
               type = c("n", "n", "n", "n", "s", "s", "s", "s", "s", "s", "s", "s"),
               name.group = c("Poste", "Region", "Experience", "Age", "AFE", "AFP", "CF", "IEIP", "INTU", "LDS", "MOT", "NSUB"),
               graph = F
               )

print(res.mfa)
**Results of the Multiple Factor Analysis (MFA)**
The analysis was performed on 133 individuals, described by 47 variables
*Results are available in the following objects :

   name                 description                                    
1  "$eig"               "eigenvalues"                                  
2  "$separate.analyses" "separate analyses for each group of variables"
3  "$group"             "results for all the groups"                   
4  "$partial.axes"      "results for the partial axes"                 
5  "$inertia.ratio"     "inertia ratio"                                
6  "$ind"               "results for the individuals"                  
7  "$quanti.var"        "results for the quantitative variables"       
8  "$quali.var"         "results for the categorical variables"        
9  "$summary.quanti"    "summary for the quantitative variables"       
10 "$summary.quali"     "summary for the categorical variables"        
11 "$global.pca"        "results for the global PCA"                   

Valeurs propres

La valeur propre est une mesure de l’importance d’un facteur. Elle correspond au rapport entre la variance expliquée par le facteur et la variance totale des données. Plus la valeur propre d’un facteur est élevée, plus le facteur explique de variance dans les données et donc plus il est important.

Les valeurs propres sont généralement présentées sous forme de pourcentage, de manière à ce qu’elles puissent être comparées entre elles. Par exemple, si le premier facteur explique 40% de la variance totale des données et que le second facteur explique 20% de la variance, on peut dire que le premier facteur est deux fois plus important que le second.

eig.val <- get_eigenvalue(res.mfa)
head(eig.val, 20)
       eigenvalue variance.percent cumulative.variance.percent
Dim.1   4.2988371        11.389143                    11.38914
Dim.2   2.5607966         6.784457                    18.17360
Dim.3   2.0790235         5.508070                    23.68167
Dim.4   1.7307261         4.585307                    28.26698
Dim.5   1.6550797         4.384893                    32.65187
Dim.6   1.5682410         4.154826                    36.80669
Dim.7   1.4514605         3.845433                    40.65213
Dim.8   1.3857475         3.671336                    44.32346
Dim.9   1.2875033         3.411052                    47.73452
Dim.10  1.2224779         3.238777                    50.97329
Dim.11  1.1222639         2.973275                    53.94657
Dim.12  1.1151031         2.954303                    56.90087
Dim.13  0.9887706         2.619604                    59.52048
Dim.14  0.9298003         2.463370                    61.98385
Dim.15  0.8949621         2.371072                    64.35492
Dim.16  0.8426883         2.232580                    66.58750
Dim.17  0.8303827         2.199978                    68.78748
Dim.18  0.7356160         1.948907                    70.73638
Dim.19  0.7274886         1.927375                    72.66376
Dim.20  0.6718766         1.780039                    74.44380
fviz_screeplot(res.mfa)

Le jeu de données n’explique que très peu de variance. Il faudrait pas moins de 18 dimensions pour expliquer 70% de la variance. Les analyses qui suivront ne pourront d’être interprétées comme expliquant seulement 18% de la variance.

Contribution aux dimensions

group <- get_mfa_var(res.mfa, "group")

fviz_mfa_var(res.mfa, "group")

Le graphique ci-dessus illustre la corrélation entre les groupes et les dimensions.

Nous pouvons remarquer que la dimension 2 représentée par l’axe des ordonnées est constitué des variables catégorielles tandis que la dimension 1 en abscisse est formée principalement pour les variables suivantes :

  • Motivation
  • Conditions facilitantes
  • Attente face à la performance
  • Intention d’adoption
  • Image espérée et identité
# Contribution à la première dimension
fviz_contrib(res.mfa, "group", axes = 1)


# Contribution à la deuxième dimension
fviz_contrib(res.mfa, "group", axes = 2)

Variables quantitatives

quanti.var <- get_mfa_var(res.mfa, "quanti.var")

fviz_mfa_var(res.mfa, "quanti.var", repel = T)


fviz_mfa_var(res.mfa, "quanti.var", repel = T, geom = c("point", "text"), legend = "bottom")

fviz_contrib (res.mfa, choice = "quanti.var", axes = 1, top = 20)


fviz_contrib (res.mfa, choice = "quanti.var", axes = 2, top = 20)

Individus

Contribution

ind <- get_mfa_ind(res.mfa)

fviz_mfa_ind(res.mfa, col.ind = "cos2", 
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = T)

Poste

Les ellipses de confiance sont utilisées dans l’analyse en composantes principales (ACP) pour représenter graphiquement l’incertitude associée aux scores des individus sur chaque composante principale. Les ellipses de confiance sont des ellipses qui entourent chaque point de score sur chaque composante principale. Plus l’ellipse est grande, plus l’incertitude est importante pour le score de l’individu sur la composante principale en question.

fviz_mfa_ind(res.mfa, 
             habillage = "Poste", # color by groups
             addEllipses = TRUE, ellipse.type = "confidence", 
             repel = TRUE 
             ) 

Région

fviz_mfa_ind(res.mfa, 
             habillage = "Region", # color by groups
             addEllipses = TRUE, ellipse.type = "confidence", 
             repel = TRUE 
             ) 

Expérience

fviz_mfa_ind(res.mfa, 
             habillage = "Experience", # color by groups
             addEllipses = TRUE, ellipse.type = "confidence", 
             repel = TRUE 
             ) 

Age

fviz_mfa_ind(res.mfa, 
             habillage = "Age", # color by groups
             addEllipses = TRUE, ellipse.type = "confidence", 
             repel = TRUE 
             ) 

LS0tCnRpdGxlOiAiQW5hbHlzZSBGYWN0b3JpZWxsZSBNdWx0aXBsZSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKTCdhbmFseXNlIGZhY3RvcmllbGxlIG11bHRpcGxlIChBRk0pIGVzdCB1bmUgdGVjaG5pcXVlIGRlIHRyYWl0ZW1lbnQgZXQgZGUgdmlzdWFsaXNhdGlvbiBkZXMgZG9ubsOpZXMgbXVsdGlkaW1lbnNpb25uZWxsZXMgcXVpIGEgcG91ciBvYmplY3RpZiBkZSByw6lkdWlyZSBsYSBkaW1lbnNpb25uYWxpdMOpIGQndW4gZW5zZW1ibGUgZGUgZG9ubsOpZXMgdG91dCBlbiBjb25zZXJ2YW50IGxlIG1heGltdW0gZCdpbmZvcm1hdGlvbnMuIEVsbGUgZXN0IHNpbWlsYWlyZSDDoCBsJ2FuYWx5c2UgZW4gY29tcG9zYW50ZXMgcHJpbmNpcGFsZXMgKEFDUCksIG1haXMgZWxsZSBlc3QgcGx1cyBmbGV4aWJsZSBldCBwZXJtZXQgZGUgcHJlbmRyZSBlbiBjb21wdGUgZGVzIGh5cG90aMOoc2VzIHN1ciBsZXMgcmVsYXRpb25zIGVudHJlIGxlcyB2YXJpYWJsZXMuCgpDb21tZSBwb3VyIGwnQUNQLCBsJ0FGTSBjb25zaXN0ZSDDoCB0cm91dmVyIGRlIG5vdXZlbGxlcyB2YXJpYWJsZXMsIGFwcGVsw6llcyAiZmFjdGV1cnMiLCBxdWkgc29udCBkZXMgY29tYmluYWlzb25zIGxpbsOpYWlyZXMgZGVzIHZhcmlhYmxlcyBvcmlnaW5hbGVzLiBDZXMgZmFjdGV1cnMgc29udCBjaG9pc2lzIGRlIHNvcnRlIHF1J2lscyBleHBsaXF1ZW50IGxlIG1heGltdW0gZGUgdmFyaWFuY2UgcG9zc2libGUgZGFucyBsZXMgZG9ubsOpZXMuIFRvdXRlZm9pcywgY29udHJhaXJlbWVudCDDoCBsJ0FDUCwgbCdBRk0gcGVybWV0IGRlIHNww6ljaWZpZXIgZGVzIGh5cG90aMOoc2VzIHN1ciBsZXMgcmVsYXRpb25zIGVudHJlIGxlcyB2YXJpYWJsZXMsIHBhciBleGVtcGxlIGVuIGltcG9zYW50IHF1ZSBjZXJ0YWlucyBmYWN0ZXVycyBzb2llbnQgY29ycsOpbMOpcyBlbnRyZSBldXguCgpMJ0FGTSBlc3Qgc291dmVudCB1dGlsaXPDqWUgbG9yc3F1ZSBsJ29uIHZldXQgY29tcHJlbmRyZSBsZXMgcmVsYXRpb25zIGRlIGNhdXNhbGl0w6kgZW50cmUgbGVzIHZhcmlhYmxlcyBldCBsb3JzcXUnb24gdmV1dCBjcsOpZXIgZGVzIGluZGljZXMgY29tcG9zaXRlcyDDoCBwYXJ0aXIgZGUgcGx1c2lldXJzIHZhcmlhYmxlcy4gRWxsZSBlc3Qgw6lnYWxlbWVudCB1dGlsaXPDqWUgZW4gcHLDqXRyYWl0ZW1lbnQgZGUgZG9ubsOpZXMgYXZhbnQgZGUgbGVzIHV0aWxpc2VyIGRhbnMgdW4gbW9kw6hsZSBkZSBwcsOpZGljdGlvbiBvdSBkZSBjbGFzc2lmaWNhdGlvbi4KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkgICMgTWFuaXB1bGF0aW9uIGRlcyBkb25uw6llcwpsaWJyYXJ5KHJlYWR4bCkgICAgICMgTGVjdHVyZSBkZXMgZmljaGllcnMgRXhjZWwKbGlicmFyeShnZ3B1YnIpICAgICAjIFJlcHLDqXNlbnRhdGlvbnMgZ3JhcGhpcXVlcwpsaWJyYXJ5KHJzdGF0aXgpICAgICMgVGVzdHMgc3RhdGlzdGlxdWVzIGVuIGxhbmdhZ2UgRHBseXIKbGlicmFyeShGYWN0b01pbmVSKSAjIEFuYWx5c2VzIGVuIGNvbXBvc2FudGVzIHByaW5jaXBhbGVzCmxpYnJhcnkoZmFjdG9leHRyYSkgIyBWaXN1YWxpc2F0aW9uIGdyYXBoaXF1ZSBkZSBsJ0FDUApsaWJyYXJ5KGd0c3VtbWFyeSkgICMgUsOpc3Vtw6kgZGVzY3JpcHRpZiBkZXMgZG9ubsOpZXMKbGlicmFyeShjb3JycGxvdCkgICAjIENvcnLDqWxvZ3JhbW1lcwpsaWJyYXJ5KHBsb3RseSkgICAgICMgR3JhcGhlcyBpbnTDqXJhY3RpZnMKYGBgCgoKIyBBdmVjIGxlcyBkb25uw6llcyBjb21wbMOodGVzIAoKYGBge3J9CmRhdGEgPC0gcmVhZF9leGNlbCgiZGF0YS9kYXRhX3Vicy54bHN4Iiwgc2hlZXQgPSAiZGF0YV9hZm0iKQpkYXRhJElEIDwtIGFzLmZhY3RvcihkYXRhJElEKQpkYXRhJFBheXMgPC0gYXMuZmFjdG9yKGRhdGEkUGF5cykKZGF0YSRQb3N0ZSA8LSBhcy5mYWN0b3IoZGF0YSRQb3N0ZSkKZGF0YSRSZWdpb24gPC0gYXMuZmFjdG9yKGRhdGEkUmVnaW9uKQpkYXRhJEV4cGVyaWVuY2UgPC0gYXMuZmFjdG9yKGRhdGEkRXhwZXJpZW5jZSkKZGF0YSRBZ2UgPC0gYXMuZmFjdG9yKGRhdGEkQWdlKQpkYXRhJFNleGUgPC0gYXMuZmFjdG9yKGRhdGEkU2V4ZSkKZGF0YSRFeHBlcmllbmNlIDwtIGFzLmZhY3RvcihkYXRhJEV4cGVyaWVuY2UpCmRhdGEkVHlwZSA8LSBhcy5mYWN0b3IoZGF0YSRUeXBlKQoKZGF0YSA8LSBkYXRhICU+JQogIHNlbGVjdCgtQzIsIC1DMywgLUM0LjEsCS1DNC4yLCAtQzQuMywgLUM0LjQsIC1DNC41LCAtQzQuNiwgLUM0LjcsIC1DNC44LCAtQzQuOSwgLVR5cGUsIC1QYXlzLCAtU2V4ZSkKCmRhdGEgPC0gY29sdW1uX3RvX3Jvd25hbWVzKGRhdGEsICJJRCIpCgpkYXRhQ29tcCA8LSBkYXRhICU+JQogIGRyb3BfbmEoKQoKZGF0YUNvbXAKYGBgCgoKIyMgQ29ycsOpbGF0aW9ucwoKYGBge3J9CmRhdGFDb21wICU+JQogIHNlbGVjdCh3aGVyZShpcy5udW1lcmljKSkgJT4lCiAgY29yX21hdCgpICU+JQogIGNvcl9wbG90KG1ldGhvZCA9ICJzcXVhcmUiLCB0eXBlID0gImxvd2VyIiwgaW5zaWduaWZpY2FudCA9ICJibGFuayIpCmBgYAoKCkxlIG1hbnF1ZSBkZSBjb3Jyw6lsYXRpb25zIGVudHJlIGxlcyB2YXJpYWJsZXMgcGV1dCBkw6lqw6Agbm91cyBpbmRpcXVlciBxdWUgbCdlbnNlbWJsZSBkZXMgZG9ubsOpZXMgbmUgcG91cnJhIHBhcyBleHBsaXF1ZXIgdW5lIGdyYW5kZSBwYXJ0aWUgZGUgbGEgdmFyaWFuY2UuIERlIHBsdXMsIGxlcyBkaW1lbnNpb25zIGRlIGwnYW5hbHlzZXMgbmUgcG91cnJvbnQgcGFzIHJlcHLDqXNlbnRlciBsZXMgdmFyaWFibGVzIGRhbnMgbGV1ciBlbnRpw6hyZXTDqS4KCgoKYGBge3J9CmRhdGFDb21wICU+JQogIHNlbGVjdCh3aGVyZShpcy5udW1lcmljKSkgJT4lCiAgY29yX21hdCgpICU+JQogIGNvcl9wbG90KG1ldGhvZCA9ICJzcXVhcmUiLCB0eXBlID0gImxvd2VyIiwgaW5zaWduaWZpY2FudCA9ICJibGFuayIpCmBgYAoKCgojIE1GQQoKCmBgYHtyfQpyZXMubWZhIDwtIE1GQShkYXRhQ29tcCwgCiAgICAgICAgICAgICAgIGdyb3VwID0gYygxLCAxLCAxLCAxLCA0LCA2LCA4LCA0LCAxLCA2LCA5LCA1KSwKICAgICAgICAgICAgICAgdHlwZSA9IGMoIm4iLCAibiIsICJuIiwgIm4iLCAicyIsICJzIiwgInMiLCAicyIsICJzIiwgInMiLCAicyIsICJzIiksCiAgICAgICAgICAgICAgIG5hbWUuZ3JvdXAgPSBjKCJQb3N0ZSIsICJSZWdpb24iLCAiRXhwZXJpZW5jZSIsICJBZ2UiLCAiQUZFIiwgIkFGUCIsICJDRiIsICJJRUlQIiwgIklOVFUiLCAiTERTIiwgIk1PVCIsICJOU1VCIiksCiAgICAgICAgICAgICAgIGdyYXBoID0gRgogICAgICAgICAgICAgICApCgpwcmludChyZXMubWZhKQpgYGAKCgojIyBWYWxldXJzIHByb3ByZXMKCkxhIHZhbGV1ciBwcm9wcmUgZXN0IHVuZSBtZXN1cmUgZGUgbCdpbXBvcnRhbmNlIGQndW4gZmFjdGV1ci4gRWxsZSBjb3JyZXNwb25kIGF1IHJhcHBvcnQgZW50cmUgbGEgdmFyaWFuY2UgZXhwbGlxdcOpZSBwYXIgbGUgZmFjdGV1ciBldCBsYSB2YXJpYW5jZSB0b3RhbGUgZGVzIGRvbm7DqWVzLiBQbHVzIGxhIHZhbGV1ciBwcm9wcmUgZCd1biBmYWN0ZXVyIGVzdCDDqWxldsOpZSwgcGx1cyBsZSBmYWN0ZXVyIGV4cGxpcXVlIGRlIHZhcmlhbmNlIGRhbnMgbGVzIGRvbm7DqWVzIGV0IGRvbmMgcGx1cyBpbCBlc3QgaW1wb3J0YW50LgoKTGVzIHZhbGV1cnMgcHJvcHJlcyBzb250IGfDqW7DqXJhbGVtZW50IHByw6lzZW50w6llcyBzb3VzIGZvcm1lIGRlIHBvdXJjZW50YWdlLCBkZSBtYW5pw6hyZSDDoCBjZSBxdSdlbGxlcyBwdWlzc2VudCDDqnRyZSBjb21wYXLDqWVzIGVudHJlIGVsbGVzLiAqUGFyIGV4ZW1wbGUsIHNpIGxlIHByZW1pZXIgZmFjdGV1ciBleHBsaXF1ZSA0MCUgZGUgbGEgdmFyaWFuY2UgdG90YWxlIGRlcyBkb25uw6llcyBldCBxdWUgbGUgc2Vjb25kIGZhY3RldXIgZXhwbGlxdWUgMjAlIGRlIGxhIHZhcmlhbmNlLCBvbiBwZXV0IGRpcmUgcXVlIGxlIHByZW1pZXIgZmFjdGV1ciBlc3QgZGV1eCBmb2lzIHBsdXMgaW1wb3J0YW50IHF1ZSBsZSBzZWNvbmQuKgoKYGBge3J9CmVpZy52YWwgPC0gZ2V0X2VpZ2VudmFsdWUocmVzLm1mYSkKaGVhZChlaWcudmFsLCAyMCkKZnZpel9zY3JlZXBsb3QocmVzLm1mYSkKYGBgCgpMZSBqZXUgZGUgZG9ubsOpZXMgKipuJ2V4cGxpcXVlIHF1ZSB0csOocyBwZXUgZGUgdmFyaWFuY2UqKi4gSWwgZmF1ZHJhaXQgcGFzIG1vaW5zIGRlIDE4IGRpbWVuc2lvbnMgcG91ciBleHBsaXF1ZXIgNzAlIGRlIGxhIHZhcmlhbmNlLiBMZXMgYW5hbHlzZXMgcXVpIHN1aXZyb250IG5lIHBvdXJyb250IGQnw6p0cmUgaW50ZXJwcsOpdMOpZXMgY29tbWUgZXhwbGlxdWFudCAqKnNldWxlbWVudCAxOCUgZGUgbGEgdmFyaWFuY2UqKi4KCiMjIENvbnRyaWJ1dGlvbiBhdXggZGltZW5zaW9ucwoKYGBge3J9Cmdyb3VwIDwtIGdldF9tZmFfdmFyKHJlcy5tZmEsICJncm91cCIpCgpmdml6X21mYV92YXIocmVzLm1mYSwgImdyb3VwIikKYGBgCgpMZSBncmFwaGlxdWUgY2ktZGVzc3VzIGlsbHVzdHJlIGxhIGNvcnLDqWxhdGlvbiBlbnRyZSBsZXMgZ3JvdXBlcyBldCBsZXMgZGltZW5zaW9ucy4KCk5vdXMgcG91dm9ucyByZW1hcnF1ZXIgcXVlIGxhIGRpbWVuc2lvbiAyIHJlcHLDqXNlbnTDqWUgcGFyIGwnYXhlIGRlcyBvcmRvbm7DqWVzIGVzdCBjb25zdGl0dcOpIGRlcyB2YXJpYWJsZXMgY2F0w6lnb3JpZWxsZXMgdGFuZGlzIHF1ZSBsYSBkaW1lbnNpb24gMSBlbiBhYnNjaXNzZSBlc3QgZm9ybcOpZSBwcmluY2lwYWxlbWVudCBwb3VyIGxlcyB2YXJpYWJsZXMgc3VpdmFudGVzIDoKCi0gTW90aXZhdGlvbgotIENvbmRpdGlvbnMgZmFjaWxpdGFudGVzCi0gQXR0ZW50ZSBmYWNlIMOgIGxhIHBlcmZvcm1hbmNlCi0gSW50ZW50aW9uIGQnYWRvcHRpb24KLSBJbWFnZSBlc3DDqXLDqWUgZXQgaWRlbnRpdMOpCgoKYGBge3J9CiMgQ29udHJpYnV0aW9uIMOgIGxhIHByZW1pw6hyZSBkaW1lbnNpb24KZnZpel9jb250cmliKHJlcy5tZmEsICJncm91cCIsIGF4ZXMgPSAxKQoKIyBDb250cmlidXRpb24gw6AgbGEgZGV1eGnDqG1lIGRpbWVuc2lvbgpmdml6X2NvbnRyaWIocmVzLm1mYSwgImdyb3VwIiwgYXhlcyA9IDIpCmBgYAoKCiMjIyBWYXJpYWJsZXMgcXVhbnRpdGF0aXZlcwoKYGBge3J9CnF1YW50aS52YXIgPC0gZ2V0X21mYV92YXIocmVzLm1mYSwgInF1YW50aS52YXIiKQoKZnZpel9tZmFfdmFyKHJlcy5tZmEsICJxdWFudGkudmFyIiwgcmVwZWwgPSBUKQoKZnZpel9tZmFfdmFyKHJlcy5tZmEsICJxdWFudGkudmFyIiwgcmVwZWwgPSBULCBnZW9tID0gYygicG9pbnQiLCAidGV4dCIpLCBsZWdlbmQgPSAiYm90dG9tIikKYGBgCgpgYGB7cn0KZnZpel9jb250cmliIChyZXMubWZhLCBjaG9pY2UgPSAicXVhbnRpLnZhciIsIGF4ZXMgPSAxLCB0b3AgPSAyMCkKCmZ2aXpfY29udHJpYiAocmVzLm1mYSwgY2hvaWNlID0gInF1YW50aS52YXIiLCBheGVzID0gMiwgdG9wID0gMjApCmBgYAoKCiMjIEluZGl2aWR1cwoKIyMjIENvbnRyaWJ1dGlvbgoKYGBge3J9CmluZCA8LSBnZXRfbWZhX2luZChyZXMubWZhKQoKZnZpel9tZmFfaW5kKHJlcy5tZmEsIGNvbC5pbmQgPSAiY29zMiIsIAogICAgICAgICAgICAgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksCiAgICAgICAgICAgICByZXBlbCA9IFQpCmBgYAoKIyMjIFBvc3RlCgpMZXMgZWxsaXBzZXMgZGUgY29uZmlhbmNlIHNvbnQgdXRpbGlzw6llcyBkYW5zIGwnYW5hbHlzZSBlbiBjb21wb3NhbnRlcyBwcmluY2lwYWxlcyAoQUNQKSBwb3VyIHJlcHLDqXNlbnRlciBncmFwaGlxdWVtZW50IGwnaW5jZXJ0aXR1ZGUgYXNzb2Npw6llIGF1eCBzY29yZXMgZGVzIGluZGl2aWR1cyBzdXIgY2hhcXVlIGNvbXBvc2FudGUgcHJpbmNpcGFsZS4gTGVzIGVsbGlwc2VzIGRlIGNvbmZpYW5jZSBzb250IGRlcyBlbGxpcHNlcyBxdWkgZW50b3VyZW50IGNoYXF1ZSBwb2ludCBkZSBzY29yZSBzdXIgY2hhcXVlIGNvbXBvc2FudGUgcHJpbmNpcGFsZS4gUGx1cyBsJ2VsbGlwc2UgZXN0IGdyYW5kZSwgcGx1cyBsJ2luY2VydGl0dWRlIGVzdCBpbXBvcnRhbnRlIHBvdXIgbGUgc2NvcmUgZGUgbCdpbmRpdmlkdSBzdXIgbGEgY29tcG9zYW50ZSBwcmluY2lwYWxlIGVuIHF1ZXN0aW9uLgoKYGBge3J9CmZ2aXpfbWZhX2luZChyZXMubWZhLCAKICAgICAgICAgICAgIGhhYmlsbGFnZSA9ICJQb3N0ZSIsICMgY29sb3IgYnkgZ3JvdXBzCiAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IFRSVUUsIGVsbGlwc2UudHlwZSA9ICJjb25maWRlbmNlIiwgCiAgICAgICAgICAgICByZXBlbCA9IFRSVUUgCiAgICAgICAgICAgICApIApgYGAKCgojIyMgUsOpZ2lvbgoKYGBge3J9CmZ2aXpfbWZhX2luZChyZXMubWZhLCAKICAgICAgICAgICAgIGhhYmlsbGFnZSA9ICJSZWdpb24iLCAjIGNvbG9yIGJ5IGdyb3VwcwogICAgICAgICAgICAgYWRkRWxsaXBzZXMgPSBUUlVFLCBlbGxpcHNlLnR5cGUgPSAiY29uZmlkZW5jZSIsIAogICAgICAgICAgICAgcmVwZWwgPSBUUlVFIAogICAgICAgICAgICAgKSAKYGBgCgojIyMgRXhww6lyaWVuY2UKCmBgYHtyfQpmdml6X21mYV9pbmQocmVzLm1mYSwgCiAgICAgICAgICAgICBoYWJpbGxhZ2UgPSAiRXhwZXJpZW5jZSIsICMgY29sb3IgYnkgZ3JvdXBzCiAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IFRSVUUsIGVsbGlwc2UudHlwZSA9ICJjb25maWRlbmNlIiwgCiAgICAgICAgICAgICByZXBlbCA9IFRSVUUgCiAgICAgICAgICAgICApIApgYGAKCiMjIyBBZ2UKCmBgYHtyfQpmdml6X21mYV9pbmQocmVzLm1mYSwgCiAgICAgICAgICAgICBoYWJpbGxhZ2UgPSAiQWdlIiwgIyBjb2xvciBieSBncm91cHMKICAgICAgICAgICAgIGFkZEVsbGlwc2VzID0gVFJVRSwgZWxsaXBzZS50eXBlID0gImNvbmZpZGVuY2UiLCAKICAgICAgICAgICAgIHJlcGVsID0gVFJVRSAKICAgICAgICAgICAgICkgCmBgYAoKCgoKCgoKCgo=